package fr.afcepf.atod.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import fr.afcepf.atod.entity.Stagiaire;
import fr.afcepf.atod.exception.Atod21Exception;
/**
 * @see IDaoStagiaire
 * @author maTos
 *
 */
public class DaoStagiaireImpl implements IDaoStagiaire {

/**
 * DataSource pour l'acces a la BDD "organisme_formation".
 */
private Atod21DataSource ds = new Atod21DataSource();

/**
 * requete pour ajouter dans la BDD.
 */
private final String reqAjout = "INSERT INTO stagiaire "
        + "(nom,prenom,date_naissance,adresse,id_organisme) values (?,?,?,?,?)";


@Override
public List<Stagiaire> rechercheNom(String paramNom) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public List<Stagiaire> rechercheId(int paramIdOrganisme) {
    // TODO Auto-generated method stub
    return null;
}

/**
 * Indice du parametre pour le nom {@link Stagiaire} dans la requete {@link DaoStagiaireImpl#reqAjout}.
 */
private final int indiceNomReqAjout = 1;
/**
 * Indice du parametre pour le prenom {@link Stagiaire} dans la requete {@link DaoStagiaireImpl#reqAjout}.
 */
private final int indicePrenomReqAjout = 2;
/**
 * Indice du parametre pour la date de naissance {@link Stagiaire} dans la requete {@link DaoStagiaireImpl#reqAjout}.
 */
private final int indiceNaissanceReqAjout = 3;
/**
 * Indice du parametre pour l'adresse {@link Stagiaire} dans la requete {@link DaoStagiaireImpl#reqAjout}.
 */
private final int indiceAdresseReqAjout = 4;
/**
 * Indice du parametre pour l'organisme {@link Stagiaire} dans la requete {@link DaoStagiaireImpl#reqAjout}.
 */
private final int indiceOrganismeReqAjout = 5;


/*
 * @see fr.afcepf.atod.data.IDaoStagiaire#ajouterStagiaire(fr.afcepf.atod.entity.Stagiaire)
 */
@Override
public Stagiaire ajouterStagiaire(Stagiaire paramStagiaire) throws Atod21Exception {
    Connection cnx;
    try {
        cnx = ds.getConnection();
        PreparedStatement pstmt = cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
        pstmt.setString(indiceNomReqAjout, paramStagiaire.getNom());
        pstmt.setString(indicePrenomReqAjout, paramStagiaire.getPrenom());
        pstmt.setDate(indiceNaissanceReqAjout, new java.sql.Date(paramStagiaire.getDateNaissance().getTime()));
        pstmt.setString(indiceAdresseReqAjout, paramStagiaire.getAdresse());
        if (paramStagiaire.getOrganisme() != null && paramStagiaire.getOrganisme().getId() != 0) {
            pstmt.setInt(indiceOrganismeReqAjout, paramStagiaire.getOrganisme().getId());
            } else { pstmt.setNull(indiceOrganismeReqAjout, Types.INTEGER);
        }
        int resultSql = pstmt.executeUpdate();
        if (resultSql == 1) {
            ResultSet rs = pstmt.getGeneratedKeys();
            if (rs.next()) {
                paramStagiaire.setId(rs.getInt(1));
            }
        }
//        pstmt.setString(indiceAdresseReqAjout, paramStagiaire.getAdresse());
//        pstmt.setInt(indiceOrganismeReqAjout, paramStagiaire.getOrganisme().getId());
    } catch (SQLException e) {
throw new Atod21Exception("Erreur 10001 - DaoStagiaire ->ajouterStagiaire " + e.getMessage());
    }

    return paramStagiaire;
}

private final String reqRenvoi="UPDATE stagiaire set id_organisme = null WHERE idstagiaire = ? and id_organisme = ?";

private final int indiceIdStagRenvoi=1;

private final int indiceIdOrganismeRenvoi = 2;
/**
 * methode de renvoi du stagiaire de la formation
 */

@Override
public Stagiaire renvoi(Stagiaire paramStag) throws Atod21Exception {
    Connection cnx;
    
    try {
        cnx = ds.getConnection();
        PreparedStatement pstmt = cnx.prepareStatement(reqRenvoi);
        pstmt.setInt(indiceIdStagRenvoi, paramStag.getId());
        pstmt.setInt(indiceIdOrganismeRenvoi, paramStag.getOrganisme().getId());
        if (pstmt.executeUpdate()==1){paramStag.setOrganisme(null);}
        else {
        throw new Atod21Exception("Erreur 10002 - DaoStagiaire->renvoi"+"Le stagiaire n'est pas dans cet organisme");}

    } catch (SQLException e) {
        throw new Atod21Exception("Erreur 10002 - DaoStagiaire -> renvoi"+e.getMessage());
    }
    return paramStag;
}

}
